﻿using System;
using System.Linq;
using System.Xml.Linq;
using System.IO;

namespace TnaguTetris
{

    /// <summary>
    /// Hoiab endas kõike mis on seotud edetabeliga (highscore'iga).
    /// </summary>
    class Highscore
    {

        /*
         * muutujad, mida on vaja kasutada rohkem kui üks kord ning 
         * mis ei muutu kunagi (va. juhul kui ise muudame arenduse käigus). 
         */
        private const String XML_DATA_HOLDER = "hiscore.xml";
        private const String XML_DATA_HOLDER_ELEMENT = "data";


        /// <summary>
        /// Tekitab XML faili tulemuste salvestamiseks.
        /// </summary>
        public void MakeXMLHiScore()
        {
            XElement root = new XElement(XML_DATA_HOLDER_ELEMENT);
            XDocument xDoc = new XDocument(root);
            XDeclaration dek = new XDeclaration("1.0", "utf-8", "yes");

            xDoc.Declaration = dek;
            xDoc.Save(XML_DATA_HOLDER);
        }


        /// <summary>
        /// Salvestab uue skoori xml faili.
        /// </summary>
        /// <param name="name">Kasutajanimi kes soovib oma skoori salvestada.</param>
        /// <param name="score">Tulemuse väärtus (täisarv).</param>
        public void SaveHiScore(String name, int score)
        {
            if (name != "")
            {
                string scoreSalastatud = Krypteerimine.KrypteeriTulemus(score);
                string nameSalastatud = Krypteerimine.KrypteeriNimi(name);

                string curFile = @XML_DATA_HOLDER;

                if (File.Exists(curFile))
                {
                    XDocument doc = XDocument.Load(XML_DATA_HOLDER);

                    XElement uus = new XElement("player",
                        new XElement("name", nameSalastatud),
                        new XElement("score", scoreSalastatud));

                    doc.Element(XML_DATA_HOLDER_ELEMENT).Add(uus);

                    doc.Save(XML_DATA_HOLDER);
                }
                else
                {
                    
                    MakeXMLHiScore();
                    SaveHiScore(name, score);
                }
            }
        }


        /// <summary>
        /// Laeb edetabeli kõik kasutajad kes on tulemuse kirja saanud.
        /// </summary>
        /// <returns>String tüüpi massiiv mis koosneb kasutajanimedest.</returns>
        public String[] ReadHiScoreNames()
        {
            //loome massiivi kuhu paigutame edetabeli kasutajanimed
            String[] hiscore_names = new string[0];
            string curFile = @XML_DATA_HOLDER;

            if (File.Exists(curFile))
            {
                XDocument xDoc = XDocument.Load(XML_DATA_HOLDER);
                try
                {
                    //loeme kokku kui palju on XML failis nimesid
                    var nimed = from x in xDoc.Elements(XML_DATA_HOLDER_ELEMENT).Elements() select x;
                    int i = 0;

                    foreach (var x in nimed)
                    {
                        i++;
                    }

                    // annab listile 6ige pikkuse
                    hiscore_names = new string[i];

                    // mapime XML failist andmed massiivi
                    int j = 0;
                    foreach (var x in nimed)
                    {
                        String nimi = Krypteerimine.DeKrypteeriNimi(x.Element("name").Value.ToString());

                        hiscore_names[j] = nimi;

                        j++;
                    }

                    //tagastame XML failist mapimise tulemuse
                    return hiscore_names;
                }
                catch (Exception)
                {
                }
            }

            //Juhul kui XML fail on tühi, tagastame tühja massiivi.
            return hiscore_names;
        }


        /// <summary>
        /// Laeb edetabeli kõikide kasutajate tulemused.
        /// </summary>
        /// <returns>Täisarv tüüp massiiv mis koosneb kasutajate tulemustest (score).</returns>
        public int[] ReadHiScoreScores()
        {
            //loome massiivi kuhu paigutame edetabeli kõik tulemused
            int[] hiscore_scores = new int[0];
            string curFile = @XML_DATA_HOLDER;

            if (File.Exists(curFile))
            {
                XDocument xDoc = XDocument.Load(XML_DATA_HOLDER);
                try
                {
                    //loeme elemendid kokku
                    var tulemused = from x in xDoc.Elements(XML_DATA_HOLDER_ELEMENT).Elements() select x;
                    int i = 0;

                    foreach (var x in tulemused)
                    {
                        i++;
                    }

                    // annab listile 6ige pikkuse
                    hiscore_scores = new int[i];

                    // mapime XML failist andmed massiivi
                    int j = 0;

                    foreach (var x in tulemused)
                    {
                        int skoor = Krypteerimine.DeKrypteeriTulemus(x.Element("score").Value);

                        hiscore_scores[j] = skoor;
                        j++;
                    }

                    //tagastame XML failist mapimise tulemuse
                    return hiscore_scores;

                }
                catch (Exception)
                {
                }
            }

            //Juhul kui XML fail on tühi, tagastame tühja massiivi.
            return hiscore_scores;
        }
    }
}
